[Docker] - SpringBoot + Redis λμ°κΈ°
π οΈ κ°λ° νκ²½
π¨ IDE : Intellij Ultimate
π Spring : Spring Boot 3.1.3
π οΈ Java : Amazon corretto 17
π³ Docker : 23.0.1
π» OS : M1 macOS Ventura 13.5.1
π μμ‘΄μ±
SpringBoot
λ΄λΆμμ Redis
λ₯Ό μ¬μ©ν΄μΌνκΈ° λλ¬Έμ μλ λΌμ΄λΈλ¬λ¦¬λ₯Ό μΆκ°ν΄μ€λ€.
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
βοΈ μ€μ
λ‘컬 νκ²½μμ Redis
λ₯Ό μ€ννλ €λ©΄, host
λ₯Ό localhost
λ‘ μ€μ νλ©΄ λλ€.
λ¨,
jar
νμΌλ‘ λΉλν λλ κΌredis
λ‘ λ³κ²½ν΄μ€μΌ νλ€!
# application.yaml
spring:
redis:
data:
host: redis
port: 6379
μλ μ½λμ κ°μ΄ Spring
μμ μ¬μ©ν Redis
μ 보λ₯Ό μ€μ ν΄μ€λ€.
@Configuration
public class RedisConfig {
@Value("${spring.redis.data.host}")
private String host;
@Value("${spring.redis.data.port}")
private int port;
@Bean
public RedisConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(host, port);
}
@Bean
public RedisTemplate<?, ?> redisTemplate() {
RedisTemplate<?, ?> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory());
return redisTemplate;
}
}
λ§μ½ Spring
μμ JPA
μ κ°μ λ¬Έλ²μΌλ‘ Redis
μ μ κ·Όνλ €λ©΄ μλμ κ°μ΄ ꡬμ±ν΄μ£Όλ©΄ λλ€.
@RedisHash
μ μμ±μ μ΄μ©νλ©΄ ꡬλΆνκΈ°λ μ½κ³ , μλͺ
μ£ΌκΈ°λ κ΄λ¦¬ν μ μλ€.
...
@RedisHash(value = "area", timeToLive = 30)
public class Area {
@Id
private Location location;
private final List<Festival> festivalList;
}
value
λ₯Ό μ§μ νλ©΄, Redis
μ λ°μ΄ν°κ° λ€μ΄κ° λ, keyspace
μ prefix
λ₯Ό μ§μ ν μ μκ² λλ€.
μ¦, enum
νμ
μ location
μ κ°μ΄ OSAKA
μΌ κ²½μ° area:OSAKA
λΌλ κ°μΌλ‘ μ μ₯λλ€.
ν΄λΉ λ°μ΄ν°μ μλͺ
μ£ΌκΈ°λ₯Ό μ§μ νλ €λ©΄ timeToLive
μμ±μ μΆκ°λ‘ μ£Όλ©΄ λλ€.
λν, μλμ κ°μ΄ CrudRepository
λ₯Ό μμ λ°μΌλ©΄,
Redis
λ₯Ό JPA
μ λμΌνκ² μ¬μ©ν μ μλ€.
public interface AreaRepository extends CrudRepository<Area, Location> {
}
μ΄νμλ νμ JPAλ₯Ό μ΄μ©ν κ°λ°κ³Ό λμΌνκ² νλ©΄ λλ€.
π³ λ컀
Dockerfile
νλ‘μ νΈ μ΅μμμ Dockerfile
μ μμ±νκ³ , μλμ κ°μ΄ λ£μ΄μ€λ€.
# μλ° λ²μ μ λ³ΈμΈ νλ‘μ νΈ μλ° λ²μ κ³Ό λ§μΆ°μ€λ€.
FROM openjdk:17-oracle
COPY build/libs/{project-name}-0.0.1-SNAPSHOT.jar {build-name}.jar
EXPOSE 8080
ENTRYPOINT exec java -jar {build-name}.jar
{project-name} : build/libs/
κ²½λ‘μ μλ jar
νμΌ μ΄λ¦
{build-name} : docker
μ λ°°ν¬ν μλ‘μ΄ νμΌ μ΄λ¦
# μμ
FROM openjdk:17-oracle
COPY build/libs/test-project-0.0.1-SNAPSHOT.jar test.jar
EXPOSE 8080
ENTRYPOINT exec java -jar test.jar
docker-compose.yml
Dockerfile
κ³Ό λμΌνκ² νλ‘μ νΈ μ΅μμμ docker-compose.yml
μ μμ±νκ³ , μλμ κ°μ΄ λ£μ΄μ€λ€.
version: '3.4'
services:
redis:
image: redis
ports:
- "6379:6379"
container_name: redis
festival-api:
build:
context: .
dockerfile: ./Dockerfile
ports:
- "8080:8080"
depends_on:
- redis
container_name: {build-name}
λ λ£μ΄λ μκ΄μ μμ§λ§, ꡬλΆνκΈ° μ½κ² Dockerfile
μμ μμ±ν build-name
μ κ·Έλλ‘ λ£μ΄μ£Όλ©΄ λλ€.
# μμ
...
container_name: test
π λΉλ
Spring λΉλ
gradle
μ΄ μ€μΉλμ΄ μλ κ²½μ° μλ λͺ
λ Ήμ΄λ₯Ό ν΅ν΄μ jar
νμΌλ‘ λΉλν΄μ€λ€.
application.yaml
μhost
λ₯Όredis
λ‘ μ€μ ν μ§νν΄μΌν¨
.\gradlew.bat build
λ§μ½, μ€μΉκ° λμ΄ μμ§ μμ κ²½μ° New UI
κΈ°μ€ IDE
μ°μΈ‘ gradle
μμ΄μ½μ ν΅ν΄ build
λ₯Ό μ§νν΄μ€λ€.
Docker λΉλ
IntelliJ
ν°λ―Έλμ μ΄μ©ν΄μ μλ λͺ
λ Ήμ΄λ₯Ό μ
λ ₯ν΄μ€λ€.
docker-compose -f "docker-compose.yml" up -d --build
λΉλμ μ±κ³΅νλ€λ©΄ μλ λͺ λ Ήμ΄λ₯Ό ν΅ν΄ μ μ€νμ΄ λκ³ μλμ§ νμΈν΄λ³΄λ©΄ λλ€.
docker ps
νΉμ Docker
μ΄ν리μΌμ΄μ
μ ν΅ν΄ νμΈν΄λ λλ€.
𧩠ν μ€νΈ
Postman
μ μ΄μ©ν΄μ λ‘컬μ μμ²μ 보λ΄κ±°λ localhost:8080
μ μ μν΄μ μνλ₯Ό νμΈνλ©΄ λλ€.
λκΈλ¨κΈ°κΈ°